import javax.swing.tree.TreeNode;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
//剑指 Offer II 046. 二叉树的右侧视图
//给定一个二叉树的 根节点 root，想象自己站在它的右侧，按照从顶部到底部的顺序，返回从右侧所能看到的节点值。
//
//
//
//示例 1:
//
//
//
//输入: [1,2,3,null,5,null,4]
//输出: [1,3,4]
//示例 2:
//
//输入: [1,null,3]
//输出: [1,3]
//示例 3:
//
//输入: []
//输出: []
//
//
//提示:
//
//二叉树的节点个数的范围是 [0,100]
//-100 <= Node.val <= 100
// 这个题和打印二叉树每一层 的最大结点的值思路类似,打印最大值是找最大值,这个题是找每一层的最后一个结点!!!
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
            if(root==null){
                return new ArrayList<>();
                }
                        Queue<TreeNode> queue =new LinkedList<>();
                        List<Integer> list=new ArrayList<>();
                        queue.offer(root);
                        while(!queue.isEmpty()){
                         int len=queue.size();
                            for(int i=0;i<len;i++){
                                 TreeNode cur=queue.poll();
                                 //边弹出边遍历添加左右孩子
                                if(cur.left!=null){
                                    queue.add(cur.left);
                                }
                                if(cur.right!=null){
                                    queue.add(cur.right);
                                }
                                //到了当前层的最后一个结点
                                if(i==len-1){
                                    list.add(cur.val);
                                }
                            }
                          
                        }
                        return  list;
            
    }
}